package main

import "fmt"

//通过排序边界以及排序标记优化冒泡排序
func main() {
	nums := []int{1, 5, 6, 0, 10}
	bubbleSort(nums)
	for _, v := range nums {
		fmt.Println(v)
	}
}

func bubbleSort(nums []int) []int {
	numLen := len(nums)
	lastSortIndex := 0
	sortBorder := numLen - 1
	for i := 0; i < numLen-1; i++ {
		//用于标记每一轮是否有经过重新排序
		//如果没有排序，则代表其实已经排序完毕，不用再进行了
		isSorted := true
		for j := 0; j < sortBorder; j++ {
			if nums[j] > nums[j+1] {
				nums[j], nums[j+1] = nums[j+1], nums[j]
				isSorted = false
				lastSortIndex = j
			}
		}
		sortBorder = lastSortIndex
		if isSorted {
			break
		}
	}

	return nums
}
